home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
edo
/
rex
/
rex_uty.doc
< prev
next >
Wrap
Text File
|
1994-06-01
|
18KB
|
613 lines
F-BASIC386用REXユーティリティ
OcToh[オクト]
[はじめに]
本パッケージは,F-BASIC386(以下FB386)上で,標準コマンドだけでは実現できない様な
操作を行いたい場合に便利と思われるルーチン群を集めた物です.
[ファイル構成]
パッケージ1 ディスクおよびメモリ関係ユーティリティ
BAS_LIB.REX REXファイル本体
パッケージ2 スライド辞書方式圧縮復元プロシジャ
SLIDE.REX REXファイル本体
DEENTEST.BAS サンプルプログラム
パッケージ3 EGBコールユーティリティ
EGBCALL.REX REXファイル本体
EGBCALL.BAS サンプル(テキスト画面に線を描く)
EGBCALL.ASM ソースファイル
[REX詳細]
・BAS_LIB.REX
本プロシジャは、ディスク関係の情報入手とキーボードのシフト状態、高速な
任意バイト数のファイルの読み書き、メモリ操作等を提供します。
●機械語ルーチンの種類
ルーチン番号 機能
0 ファイル名の探索(取り込み)
1 カレント・ディスクの取得
2 カレント・ディレクトリの取得
3 カレント・ディスクの移動
4 カレント・ディレクトリの変更
5 ファイルの属性の取得
6 システム情報の設定
7 システム情報の取得
8 キーボードのシフト状態(カナ,SHIFT,CTRL,親指シフト)読取
9 ブロック転送
10 ブロックフィル(1値で埋める)
11 ファイル書き出し
12 ファイル読み込み
13 リザーブ
14 ファイルサイズ取得
15 文字列検索
16 ファイル作成&書き出し
17 PSP領域からの読み込み
18 PSP領域への書き込み
●ルーチン詳細
以下に呼び出し方と、パラメータの説明をします。
なお、パラメータ最初のcmdは、REXアドレスをロードしたオフセットを示します。
◆ 0 ファイル名の探索(取り込み)
RET&=CALLM (cmd,0,SearchFile,FNBuf,FileAtt,SearchFlag )
0: ルーチン番号
SearchFile: 捜すファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
FNBuf : 返されたファイル名を格納する文字変数アドレスポインタ
FileAtt : 捜すファイルの属性(以下のビットをたてて指定する)
4 3 2 1 0 (ビット)
-+---+---+---+---+---+
|(3)| |(2)|(1)| |
-+---+---+---+---+---+
(1) 隠しファイル
(2) システムファイル
(3) サブ・ディレクトリ
指定した属性のファイルと通常のファイルが対象になります
SearchFlag: 0なら最初に一致するファイルの探索
1なら次に一致するファイルの探索
RET& 0なら正常終了
-1,-2ならエラー発生(SearchFlagが0なら-1,1なら-2)
正常終了ならFNBufにファイル名が入り、文字変数の先頭に探索したファイルが
ディレクトリかファイルかのマークが付いている
ディレクトリなら大文字のD、ファイルなら大文字のFが付いているファイル名は 2文字目以降である
◆ 1 カレント・ディスクの取得
RET&=CALLM (cmd,1)
1: ルーチン番号
RET& : 取得したカレント・ディスクのASCIIコード
◆ 2 カレント・ディレクトリの取得
RET&=CALLM (cmd,2,CRDCode,GCRDNBuf)
2: ルーチン番号
CRDCode : カレントディレクトリを取得する対象のディスクのASCII
コード
GCRDNBuf : 取得したカレントディレクトリ名を格納する文字変数のアド
レスポインタ(文字変数は、あらかじめ65バイト以上、確保して
おくこと)
RET& : 0なら正常終了
-1ならエラー(指定したドライブが無効)
◆ 3 カレント・ディスクの移動
CALLM cmd,3,CRDCode
3: ルーチン番号
CRDCode : 変更するカレントディスクのASCIIコード
◆ 4 カレント・ディレクトリの変更
CALLM cmd,4,GCRDNBuf
4: ルーチン番号
GCRDNBuf : 変更するカレントディレクトリ名を格納した文字変数のアド
レスポインタ
ディレクトリ名の最後は必ずCHR$(0)が付いていること
◆ 5 ファイルの属性の取得
RET&=CALLM(cmd,5,AnlFile)
5: ルーチン番号
AnlFile : 調べるファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
RET& : &hffffxxxxならエラー(xxxxはDOS-Extenderエラーコード)
エラーコード: 1 AL内のファンクションコードが無効
2 ファイルがない
3 パスがない
5 属性を変更できない
その他は、属性が以下のビット構成で取得される
5 4 3 2 1 0 (ビット)
--+---+---+---+---+---+---+
|(6)|(5)|(4)|(3)|(2)|(1)|
--+---+---+---+---+---+---+
(1) 0:リード/ライト
1:リードオンリー
(2) 0:通常ファイル
1:隠しファイル
(3) 0:通常ファイル
1:システムファイル
(4) 1:ボリュームラベル
(5) 1:サブ・ディレクトリ
(6) 保存ビット
◆ 6 ファイルの属性の設定
RET&=CALLM(cmd,6,AnlFile,AtrBit)
6: ルーチン番号
AnlFile : 設定するファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
AtrBit : 設定する属性(属性のビット構成は「ファイル属性の取得」を
参照してください。ただし、(4),(5)は設定できません)
RET& : 0なら正常終了
その他はエラーコード(「ファイル属性の取得」参照)
◆ 7 システム情報の取得
CALLM cmd,7,SystemInfo)
7: ルーチン番号
SystemInfo: システム情報の取得場所の文字変数アドレスポインタ
(文字変数は、あらかじめ200バイト以上、確保しておくこと)
システム情報の格納形式は、FM TOWNSテクニカルデータブック
の拡張サービスルーチン「システム情報の取得」を参照してく
ださい
◆ 8 キーボードのシフト状態(カナ,SHIFT,CTRL,親指シフト)読取
RET&=CALLM(cmd,8)
8: ルーチン番号
RET& : シフト状態が格納される
7 6 5 4 3 2 1 0 (ビット)
+---+---+---+---+---+---+---+---+
|(8)|(7)|(6)|(5)|(4)|(3)|(2)|(1)|
+---+---+---+---+---+---+---+---+
(1) CAP(英大/英小) ※3
(2) カナキー ※2
(3) SHIFTキー
(4) GRAPHキー(常に0)
(5) CTRLキー
(6) 右親指シフトキー ※1
(7) 左親指シフトキー ※1
(8) 常に0
(キー状態 0:OFF 1:ON)
※1 親指シフトキーボードで有効
※2 仮名の時ON (1)
※3 英大モード時にON (1)
◆ 9 ブロック転送
CALLM cmd,9,SSel,SAd,DSel,DAd,NBytes
9: ルーチン番号
SSel : 転送元セレクタ値(セレクタ値の詳細は、BASICマニュアルの、
PEEKコマンドを参照してください。値によってはVRAM等もア
クセス可能です)
SAd : 転送元先頭アドレス
DSel : 転送先セレクタ値
DAd : 転送先先頭アドレス
NBytes : 転送バイト数
◆ 10 ブロックフィル(1値で埋める)
CALLM cmd,10,Sel,Ad,FillV,Number,Type
10: ルーチン番号
Sel : 出力先セレクタ値(セレクタ値の詳細は、BASICマニュアルの、
PEEKコマンドを参照してください。値によってはVRAM等もア
クセス可能です)
Ad : 出力先先頭アドレス
FillV : 出力する値(Typeの値によって1~4バイト)
Number : FillVの値を何回出力するか
Type : FillVの数値タイプ
(下記以外の値を指定した場合は1を指定したとみなします)
1: Byte
2: Word
4: DWord
◆ 11 ファイル書き出し
RET&=CALLM(cmd,11,Sel,Ad,FileName,SeekOffset,NBytes)
11: ルーチン番号
Sel : バッファセレクタ値(セレクタ値の詳細は、BASICマニュアルの
PEEKコマンドを参照してください。値によってはVRAM等もアク
セス可能です)
Ad : バッファ先頭アドレス
FileName : アクセスするファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
SeekOffset: ファイルの先頭から何バイト目から書き出すかを指定
NBytes : 何バイト書き出すかを指定
本ルーチンは、実行する毎にファイルのオープン/クローズを行う様に
なっています。
何回かに分けてデータを書き出したい場合は、SeekOffsetの値を毎回、
適切に指定してください(「ファイルサイズ取得」で得たサイズを
SeekOffsetに使用するとデータがファイルの後ろに追加されていきま
す)
もしくは、SeekOffsetに-1を指定すると書き始めの位置をファイルの一
番最後に設定しますので、こちらを利用して後ろに後ろにと、データを
追加していくこともできます。
本ルーチンを使用する場合は、あらかじめ、ディスク上に書き込むファ
イルが存在している必要があります。
OPEN "O"コマンド等で、ファイルを作成してから実行してください。
(OPEN "O"コマンドを発効してすぐにCLOSEをすれば、OPENコマンドで指
定したファイル名でサイズ0のファイルが作成されます)
RET& 0なら正常終了
その他はエラー(以下のエラーコードが返される)
1:ファイルシェアリングコード無効(ルーチン内エラー)
2:ファイルが無い
3:パスがない
4:オープンファイルが多すぎる
5:アクセスが拒否された
6:ハンドルが無効(ルーチン内エラー)
12:ファイルアクセスコードが無効(ルーチン内エラー)
◆ 12 ファイル読み込み
RET&=CALLM(cmd,12,Sel,Ad,FileName,SeekOffset,NBytes)
12: ルーチン番号
Sel : バッファセレクタ値(セレクタ値の詳細は、BASICマニュアルの
PEEKコマンドを参照してください。値によってはVRAM等もアク
セス可能です)
Ad : バッファ先頭アドレス
FileName : アクセスするファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
SeekOffset: ファイルの先頭から何バイト目から読み込むかを指定
NBytes : 何バイト読み込むかを指定
本ルーチンは、実行する毎にファイルのオープン/クローズを行う様に
なっています。
何回かに分けてデータを読み込みたい場合は、SeekOffsetの値を毎回、
適切に指定してください
RET& 0なら正常終了
その他はエラー(「ファイル書き出し」を参照してください)
◆ 13 リザーブ(未使用です)
◆ 14 ファイルサイズ取得
RET&=CALLM(cmd,14,FileName)
14: ルーチン番号
FileName : サイズを調べるするファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
RET& : 最上位ビットが0ならファイルサイズ(正常終了)
最上位ビットが1ならそれ以外のビットはエラーコードが入る
1:コード無効(ルーチン内エラー)
2:ファイルが無い
3:パスがない
4:オープンファイルが多すぎる
5:アクセスが拒否された
6:ハンドルが無効(ルーチン内エラー)
12:ファイルアクセスコード無効(ルーチン内エラー)
◆ 15 文字列検索
RET&=CALLM(cmd,15,Ad,DataPat)
15: ルーチン番号
Ad : 文字列データが格納されているアドレス(データの最後には
少なくともDataPatと同じ長さのchr$(0)が付いていること)
文字変数を渡す時はPEEK(VARPTR(変数),4)とする
DataPat : 検索する文字パターンが格納されているアドレス(パターン
の最後はchr$(0)が付いていること)
文字変数を渡す時はPEEK(VARPTR(変数),4)とする
RET& 0なら文字パターンは見つからなかった
それ以外なら、先頭からのオフセットバイト数が入る
◆ 16 ファイル作成&書き出し
RET&=CALLM(cmd,16,Sel,Ad,FileName,SeekOffset,NBytes)
16: ルーチン番号
Sel : バッファセレクタ値(セレクタ値の詳細は、BASICマニュアルの
PEEKコマンドを参照してください。値によってはVRAM等もアク
セス可能です)
Ad : バッファ先頭アドレス
FileName : アクセスするファイル名の文字変数アドレスポインタ
ファイル名の最後は必ずCHR$(0)が付いていること
SeekOffset: 0を指定
NBytes : 何バイト書き出すかを指定
本ルーチンは、実行する毎にファイルのオープン/クローズを行う様に
なっています。
何回かに分けてデータを書き出したい場合は、本ルーチンを使用後、
ファイル書き出しルーチンを使用して下さい。
本ルーチンを使用する場合に、すでにディスク上に書き込むファイル
と同一ファイル名が存在していると、そのファイルは内容がクリアさ
れます。
RET& 0なら正常終了
その他はエラー(「ファイル書き出し」を参照してください)
◆ 17 PSP領域からの読み込み
CALLM cmd,17,Point,NBytes,Ad
17: ルーチン番号
Point : PSP領域の何バイト目から読み込むかを指定
NBytes : 何バイト読み込むかを指定
Ad : バッファ先頭アドレス
◆ 18 PSP領域への書き込み
CALLM cmd,18,Point,NBytes,Ad
18: ルーチン番号
Point : PSP領域の何バイト目から書き込むかを指定
NBytes : 何バイト書き込むかを指定
Ad : バッファ先頭アドレス
・SLIDE.REX
本プロシジャは、スライド辞書方式による圧縮/復元を行います。
データの大きさは32バイト以上のデータを与えるようにしてください。
内部に静的バッファ領域を確保しているためファイルサイズが少々大きいです
がこれによってかなりの効率でデータを圧縮できますのでお許し下さい。
●機械語ルーチンの種類
ルーチン番号 機能
0 データの圧縮
1 データの復元
●ルーチン詳細
poff 以下に呼び出し方と、パラメータの説明をします。
なお、パラメータ最初のcmdは、REXアドレスをロードしたオフセットを示します。
◆ 0 データの圧縮
RET&=CALLM(cmd,0,Outbuf,Inbuf,Size,BSize,FileNameAd,MaxFlg)
0: ルーチン番号
Outbuf : データ出力用一時バッファ先頭アドレス
Inbuf : 圧縮対象データ格納アドレス
Size : 圧縮対象データサイズ
BSize : データ出力用一時バッファサイズ
FileNameAd: ファイル名データが格納されているアドレス
ファイル名の最後は必ずCHR$(0)が付いていること
文字変数を渡す時はPEEK(VARPTR(変数),4)とする
MaxFlg : 0ならば出力データのサイズがsizeの値を越えても、最後まで
圧縮操作を続ける
0以外なら出力データサイズがsizeの値を越えた時点で終了し
ます
RET& : 1以上の場合 圧縮された後のデータサイズ
0 圧縮対象データサイズが小さすぎて圧縮で
きなかった
-2 MaxFlgが1の場合で、出力データの方が、元の
データサイズを越えた
&hffffxxxx ディスクアクセス時にエラーが発生した
xxxxの値はBAS_LIB.REX「ファイル書き出し」
を参照してください
本プロシジャは、実行すると圧縮終了までFB386に制御が戻りません。
プロシジャ内でファイルのオープン/クローズを行ないます。
本プロシジャを使用する場合に、ディスク上に指定されたファイルと同
じファイル名のファイルが存在していると、その内容は書き換えられま
す。存在しない場合は新たに指定ファイル名で作成されます。
空き領域のサイズは、最高でMaxFlgで1を指定した場合は、元データのサ
イズにBSizeを加えた大きさだけ必要となる場合があります。
MaxFlgが0の場合は、予測できません。
データを復元するには元のデータサイズが必要となりますので、出来た
ファイルに対して、元のデータサイズを記録する操作が必要です。
圧縮対象データはメモリ上に存在する必要があります。
詳しくはサンプルをごらんください。
◆ 1 データの圧縮
RET&=CALLM(cmd,1,Outbuf,Inbuf,Size,BSize,FileNameAd,RSize)
1: ルーチン番号
Outbuf : 出力データ格納領域先頭アドレス
Inbuf : 圧縮データ格納アドレス
Size : 元データサイズ
BSize : 0(未使用)
FileNameAd: 0(未使用)
RSize : 圧縮データのサイズ
RET& : 1以上の場合 復元された後のデータサイズ
それ以外 与えられたデータに以上があり、正確な復元
ができなかった
本ルーチンは、実行すると復元終了までFB386に制御が戻りません。
データを復元するには元のデータサイズが必要となります。
入力/出力データはメモリ上に存在します。
詳しくはサンプルをごらんください。
[サンプル説明]
BAS_LIB.REXの方はサンプルプログラムは機能が多すぎるので、つけていません。
ご質問が有る場合は、FFMHOBの会議室で著者宛にお尋ね下さい。
なお、著者作成の最近のプログラムはほとんどが本ルーチンか、本ルーチンのコンパク
ト版を用いているので、そちらをダウンロードして参考にしてもいいかと思います。
(ColorfulStick、AmazingPAINT等、両方ともFFMAVのDL 1に有ります。)
コンパクト版でもルーチン番号は共通にしてあります。
・ENDETEST.BAS
FB386上で、ディスク上にあるファイルをスライド辞書方式で圧縮/復元するプ
ログラムサンプル。圧縮/復元にSLIDE.REXを、メモリとディスクとのやり取りに
BAS_LIB.REXを使用しています。
圧縮時は50行の
*ENCODE:F$="a:\sample.tif"+CHR$(0):FO$="a:\sample.cmp"+CHR$(0)
F$に入力ファイル名、FO$に出力(圧縮)ファイル名をセットしてください。
展開時は200行の
*DECODE:FI$="a:\sample.cmp"+CHR$(0):FD$="a:\samplorg.tif"+CHR$(0)
FI$に入力(圧縮済)ファイル名、FD$に出力(復元)ファイル名をセットしてくだ
さい。
プログラムを実行すると、
get started! (E : Encode / D : Decode)
とメッセージがでますので、圧縮のときはEを、復元の時はDを入力してください。
・圧縮時のデータ出力はSLIDE.REX内のファイル出力ルーチンを用いて、自力で
行っています
・復元時はデータ入力・出力ともメモリ内にあることが前提ですのでBAS_LIB.REX
を用いています
・EGBCALL.REX
本プロシジャは,F-BASIC386(以下FB386)上からEGBをコールするために作成した機械語
ファイルです。
利用時はアセンブラと同等の呼出し方法を取りますので、アセンブラ使用時のEGBの呼出
し方の知識を有する方以外には使用は難しいかも知れません。
本パッケージにはEGBの呼出し時のパラメータの説明は付属されませんので、ユーザ自身
で、関係資料を用意してください(FM TOWNSテクニカルデータブック[通称"赤本"と呼ば
れている本]、Towns BIOSリファレンス等)。
ただし、FB386の将来のバージョンアップに際して、完全に動作を保証できるものではあ
りません。
[呼出し方法]
rexadはREXルーチンロードアドレスを示します。
・イニシャライズ時
(本プロシジャをロードしたあとに必ず1回コールしてください)
callm rexad,CMD,STACK,WORK,SIZE
CMD : 0を指定
STACK : ユーザが用意したスタックエリアの最後尾アドレス
WORK : 〃 EGBワークエリアの先頭アドレス
SIZE : 〃 のサイズ
・EGB機能利用時
callm rexad,CMD,AL,EBX,ECX,EDX,ESI,RETAD
CMD : 実行する機能をセット(AHレジスタに設定する値)
AL : ALレジスタに設定する値
EBX : EBXレジスタに設定する値
ECX : ECXレジスタに設定する値
EDX : EDXレジスタに設定する値
ESI : ESIレジスタに設定する値
RETAD : 機能終了時のレジスタ値の格納領域の先頭アドレス
領域の設定(&h2C)とポイント識別(&h4F)等を使用する 時に使用。
ここに0をセットすると、レジスタ値を返さない
・返り値
本ルーチンを関数呼出し(ret&=callm(...)の形式で呼び出した時)は、AHにセッ
トされているエラー情報の値が得られます。
また、前述してありますが、RETADにレジスタ値をセットする領域の先頭アドレス
(0以外)を設定することで、REX内部でEGB呼出しより復帰した時の各レジスタの
内容を得ることが可能です。
領域は24バイト必要です。格納形式を以下に示します。
0を指定した場合は領域の変更は行いません(できません)。
先頭→ (4バイト) EAX
( 〃 ) EBX
( 〃 ) ECX
( 〃 ) EDX
( 〃 ) ESI
( 〃 ) EDI
以上です。
具体的な使用例はサンプルを参照してください。
[権利等]
本ルーチン集の基本的部分の著作権は私、OcToh[オクト]が所有しています。
SLIDE.REXの圧縮部分本体は、参考文献1のソースリストを全体的に参考にして
BASICのREX用にデータ入出力ルーチン部を改造したものです。
本ルーチン(REXファイル本体)の使用に関しては著作者の権利を侵さないかぎ
り自由とします。
つまり、著作権者を偽って配付等しないかぎり使用に関して制限を設けません。
自作のF-BASIC386プログラムに添付して配付しても、ルーチンの作者を偽らな
ければ有料/無料に係わらず自由です。
ただし、本パッケージそのものとか、本パッケージの1部分のみを有料で配付す
る事は営利/非営利を問わず禁止させていただきます(1部分のみの場合は無料
でも不可)。
再配付は、著作権者の許可を得た上で行ってください。
本ルーチンの運用の結果につきましては、一切の義務/責任を負うことはできま
せん。各自の責任の範囲内で御使用下さい。
参考文献
1 C言語による最新アルゴリズム辞典 奥村晴彦著
技術評論社
2 Oh!FM 1991年8月号 「High CだけでREXファイルを作ろう」
ソフトバンク
3 386DOS|EXTENDERユーザーズマニュアル
富士通
4 Towns BIOSリファレンス
富士通
5 FM TOWNSテクニカルデータブック 千葉憲昭 著
アスキー